package org.sapling.data.utils;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.ObjectUtils;
import org.sapling.data.enums.DataTransExpCodeEnum;
import org.sapling.data.exp.DataTransException;
import org.springframework.stereotype.Component;

import lombok.Getter;
import lombok.Setter;

/**
 * 
 * @ClassName: DataTableFieldTypeTranslateUtils
 * @Description: 数据源字段类型翻译
 * @author DcfZero 
 * @date 2020年5月31日  
 *
 */
@Component
public class DataTableFieldTypeTranslateUtils {

	/**
	 * 	数据源类型
	 */
	@Getter
	private Integer dataSourceType;

	/**
	 * 	数据源类型字典
	 */
	private static Map<String,Integer> typeMap;
	static {
		typeMap = new HashMap<String,Integer>();
		typeMap.put("mysql", 1);
		typeMap.put("mariadb", 1);
		typeMap.put("oracle", 2);
		typeMap.put("postgresql", 3);
	}

	/**
	 * 根据数据源初始化字段翻译工具
	* @Title: init  
	* @Description: TODO
	* @param @param platform  参数  
	* @return void  返回类型  
	* @throws
	 */
	public void init(String platform) {
		dataSourceType = typeMap.get(platform);
	}


	/**
	 * 
	* @Title: translateFieldType  
	* @Description: 根据数据源翻译字段类型
	* @param @param type 字段类型
	* @param @return
	* @param @throws DataTransException  参数  
	* @return String  返回类型  
	* @throws
	 */
	public String translateFieldType(FieldType type) throws DataTransException {
		return translateFieldType(type, null, false, false);
	}

	/**
	 * 
	* @Title: translateFieldType  
	* @Description: 根据数据源翻译字段类型
	* @param @param type 字段类型
	* @param @param isNotNull 是否非空 TRUE 非空  FALSE 可以为空
	* @param @return
	* @param @throws DataTransException  参数  
	* @return String  返回类型  
	* @throws
	 */
	public String translateFieldType(FieldType type,boolean isNotNull) throws DataTransException {
		return translateFieldType(type, null, isNotNull, false);
	}


	/**
	 * /**
	 * @throws DataTransException 
	 * 
	 * @Title: translateFieldType  
	 * @Description: 根据数据源翻译字段类型
	 * @param @param type 字段类型
	 * @param @param isNotNull 是否非空 TRUE 非空  FALSE 可以为空
	 * @param @param isAuto 是否自增  TRUE 自增 FALSE 不自增
	 * @param @return  参数  
	 * @return String  返回类型  
	 * @throws
	 */
	public String translateFieldType(FieldType type,boolean isNotNull,boolean isAuto) throws DataTransException {
		if(isAuto) {
			isNotNull = true;
		}
		return translateFieldType(type, null, isNotNull, isAuto);
	}

	/**
	 * @throws DataTransException 
	 * @throws FieldTypeIsNullException 
	 * 
	 * @Title: translateFieldType  
	 * @Description: 根据数据源翻译字段类型
	 * @param @param type 字段类型
	 * @param @param degree 精度 为空则为默认精度
	 * @param @param isNotNull 是否非空 TRUE 非空  FALSE 可以为空
	 * @param @param isAuto 是否自增  TRUE 自增 FALSE 不自增
	 * @param @return  参数  
	 * @return String  翻译后字段类型
	 * @throws
	 */
	public String translateFieldType(FieldType type,Integer degree,boolean isNotNull,boolean isAuto) throws DataTransException{
		if(ObjectUtils.isEmpty(dataSourceType)) {
			throw new DataTransException(DataTransExpCodeEnum.DATASOURCETYPE_ISNULL);
		}
		if(ObjectUtils.isEmpty(type)) {
			throw new DataTransException(DataTransExpCodeEnum.FIELDTPYE_ISNULL);
		}
		switch (dataSourceType) {
		case 1:
			//mysql,mariadb
			switch (type) {
			case INT:
				return "INT" + (ObjectUtils.isEmpty(degree) ? "" : "(" + degree +")") + (isNotNull?" NOT NULL ":" ") + (isAuto?" AUTO_INCREMENT ":" ");
			case FLOAT:
				return "DOUBLE" + (ObjectUtils.isEmpty(degree) ? "" : "(" + degree +")") + (isNotNull?" NOT NULL ":" ");
			case STRING	:
				return "VARCHAR" + (ObjectUtils.isEmpty(degree) ? "(255)" : degree +")") + (isNotNull?" NOT NULL ":" ");
			case DATE : 
				return "DATE" + (isNotNull?" NOT NULL ":" ");
			case DATETIME:
				return "DATETIME" + (isNotNull?" NOT NULL ":" ");
			default:
				break;
			}
			break;
		case 2:
			//postgreSql
			break;
		case 3:
			//oracle
			break;
		default:break;
		}
		return "";
	}

	public enum FieldType{
		//整型
		INT,
		//浮点型
		FLOAT,
		//字符型
		STRING,
		//日期类型
		DATE,
		//时间类型
		DATETIME
	}
}
